package ${basePackage}.infrastructure.${modelNameLowerCamel};

import ${basePackage}.domain.${modelNameLowerCamel}.I${modelNameUpperCamel};
import ${basePackage}.domain.${modelNameLowerCamel}.I${modelNameUpperCamel}Repository;
import ${basePackage}.domain.seek.IUnitOfWork;
import ${basePackage}.infrastructure.seek.RepositoryAbstract;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;

import java.util.Arrays;
import java.util.List;

/**
 * Created by ${author} on ${date}.
 * 描述: ${modelName}的仓储操作实现对象
 */

public class ${modelNameUpperCamel}Repository extends RepositoryAbstract<I${modelNameUpperCamel}, Integer> implements I${modelNameUpperCamel}Repository {

    public ${modelNameUpperCamel}Repository(IUnitOfWork iUnitOfWork) {
        super(iUnitOfWork);
    }

    /**
    * 查询所有${modelName}的总数
    *
    * @return 总数
    */
    @Override
    public int count() {
        try {
            Criteria criteria = super.getCriteria(Class.forName("${basePackage}.domain.${modelNameLowerCamel}.${modelNameUpperCamel}"));
            criteria.setProjection(Projections.rowCount());
            return (int) criteria.uniqueResult();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 获取单个${modelName}
     *
     * @param id ${modelName}的唯一标识。
     * @return ${modelName}的实体对象
     */
    @Override
    public I${modelNameUpperCamel} get(Integer id) {
        return (I${modelNameUpperCamel}) session.get("${basePackage}.domain.${modelNameLowerCamel}.${modelNameUpperCamel}", id);
    }

    /**
     * 延迟获取单个${modelName}
     *
     * @param id ${modelName}的唯一标识。
     * @return ${modelName}的实体对象
     */
    @Override
    public I${modelNameUpperCamel} load(Integer id) {
        return (I${modelNameUpperCamel}) session.load("${basePackage}.domain.${modelNameLowerCamel}.${modelNameUpperCamel}", id);
    }

    /**
    * 查询所有${modelName}
    *
    * @return ${modelName}的list集合
    */
    @Override
    public List<I${modelNameUpperCamel}> query() {
        try {
            Criteria criteria = super.getCriteria(Class.forName("${basePackage}.domain.${modelNameLowerCamel}.${modelNameUpperCamel}"));
            return criteria.list();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }
}
